﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SGT_DAL._STG_DALTableAdapters;
using SGT_DAL;
using System.Drawing;

namespace SGT_ON
{
    /// <summary>
    /// Clase utilizada para la presentación y propiedades derivadas.
    /// </summary>
    public partial class ONElemento
    {
        public string ReponerCantidadString
        {
            get
            {
                if (ReponerCantidad == decimal.Zero)
                    return "";
                else
                {
                    return ReponerCantidad.ToString("F");
                }
                    
            }
            set
            {
                if (value == "")
                {
                    ReponerCantidad = decimal.Zero;
                    return;
                }
                decimal _valor;
                if (decimal.TryParse(value.Replace(char.Parse("."), char.Parse(",")), out _valor) == true)
                    ReponerCantidad = _valor;
                else
                    throw new ArgumentException("El valor especificado no es válido.");
            }
        }
        public string ReacondicionarCantidadString
        {
            get
            {
                if (ReacondicionarCantidad == 0)
                    return "";
                else
                {
                    return ReacondicionarCantidad.ToString();
                }

            }
            set
            {
                if (value == "")
                {
                    ReacondicionarCantidad = 0;
                    return;
                }
                int _valor;
                if (int.TryParse(value, out _valor) == true)
                    ReacondicionarCantidad = _valor;
                else
                    throw new ArgumentException("El valor especificado no es válido.");
            }
        }
        public string PintarCantidadString
        {
            get
            {
                if (PintarCantidad == decimal.Zero)
                    return "";
                else
                {
                    return PintarCantidad.ToString("F");
                }

            }
            set
            {
                if (value == "")
                {
                    PintarCantidad = decimal.Zero;
                    return;
                }
                decimal _valor;
                if (decimal.TryParse(value.Replace(char.Parse("."), char.Parse(",")), out _valor) == true)
                    PintarCantidad = _valor;
                else
                    throw new ArgumentException("El valor especificado no es válido.");
            }
        }
        /// <summary>
        /// Devuelve el nombre del item preparado para mostrarlo en un presupuesto o orden de trabajo
        /// Formato: Item-SubGrupo-Gurpo
        /// </summary>
        public string ItemParaReporte
        {
            get
            {
                //Asigno el nombre del grupo
                //string _grupo = "";
                // Comentado por pedidio de mauricio para que se muestre solo el nombre del item.
                //if (Grupo.Contains("Parte Delantera"))
                //    _grupo = "G/P Delantera";
                //else if (Grupo.Contains("Lado Derecho"))
                //    _grupo = "G/Lado Der";
                //else if (Grupo.Contains("Lado Izquierdo"))
                //    _grupo = "G/Lado Izq";
                //else if (Grupo.Contains("Parte Trasera"))
                //    _grupo = "G/P Trasera";
                //else if (Grupo.Contains("Chasis"))
                //    _grupo = "G/Chasis";
                //else if (Grupo.Contains("Interior instrumental"))
                //    _grupo = "G/Instrumental Int";
                //else if (Grupo.Contains("Mecánica"))
                //    _grupo = "G/Mecánica";
                //else if (Grupo.Contains("Transmisión"))
                //    _grupo = "G/Transmisión";
                //else if (Grupo.Contains("Dirección"))
                //    _grupo = "G/Dirección";
                //else if (Grupo.Contains("Tren Trasero"))
                //    _grupo = "G/Tren Tras";
                //else if (Grupo.Contains("Tren delantero"))
                //    _grupo = "G/Tren Del";
                
                //Grupo queda como va
                //_grupo = Grupo;


                //Asigno el nombre del subgrupo
                // Comentado por pedidio de mauricio para que se muestre solo el nombre del item.
                //string _subGrupo = "";
                //if (SubGrupo.Contains("Paragolpe"))
                //    _subGrupo = "S/Paragolpe";
                //else if(SubGrupo.Contains("Guardabarro derecho"))
                //    _subGrupo = "S/Guard Der";
                //else if (SubGrupo.Contains("Guardabarro izquierdo"))
                //    _subGrupo = "S/Guard Izq";
                //else if (SubGrupo.Contains("Capot"))
                //    _subGrupo = "S/Capot";
                //else if (SubGrupo.Contains("Puerta delantera"))
                //    _subGrupo = "S/Puerta Del";
                //else if (SubGrupo.Contains("Puerta trasera"))
                //    _subGrupo = "S/Puerta Tras";
                //else if (SubGrupo.Contains("Tapa baúl/portón"))
                //    _subGrupo = "S/Baúl/Portón";
                //else if (SubGrupo.Contains("Motor"))
                //    _subGrupo = "S/Motor";
                //else if (SubGrupo.Contains("Rueda derecha"))
                //    _subGrupo = "S/Rueda Der";
                //else if (SubGrupo.Contains("Rueda izquierda"))
                //    _subGrupo = "S/Rueda Izq";
                //_subGrupo = SubGrupo;

                //string _resultado = (Item + "-" + _subGrupo.Trim() + "-" + _grupo.Trim()).Replace("--", "-");
                string _resultado = Item;

                return _resultado;
            }
        }

        /// <summary>
        /// Color de fondo del checkbox para cuando esta seleccionado, de lo contrario deja blanco
        /// </summary>
        public System.Drawing.Color CheckBoxFondoParaDetalleReponer
        {
            get
            {

                if (Reponer == false)
                    return System.Drawing.Color.Transparent;
                else
                    return Parametros.ColorFondoCheckBoxEnDetalle;
            }
        }
        public System.Drawing.Color CheckBoxFondoParaDetalleReacondicionar
        {
            get
            {
                if (Reacondicionar == false)
                    return System.Drawing.Color.Transparent;
                else
                    return Parametros.ColorFondoCheckBoxEnDetalle;
            }
        }
        public System.Drawing.Color CheckBoxFondoParaDetalleControlar
        {
            get
            {
                if (Controlar == false)
                    return System.Drawing.Color.Transparent;
                else
                    return Parametros.ColorFondoCheckBoxEnDetalle;
            }
        }
        public System.Drawing.Color CheckBoxFondoParaDetallePintar
        {
            get
            {
                if (Pintar == false)
                    return System.Drawing.Color.Transparent;
                else
                    return Parametros.ColorFondoCheckBoxEnDetalle;
            }
        }
        public System.Drawing.Color CheckBoxFondoParaDetalleSacarColocar
        {
            get
            {
                if (SacarColocar == false)
                    return System.Drawing.Color.Transparent;
                else
                    return Parametros.ColorFondoCheckBoxEnDetalle;
            }
        }
    }
    /// <summary>
    /// Clase base con la lógica de negocio
    /// </summary>
    [System.ComponentModel.DataObject]
    public partial class ONElemento
    {
        #region Atributos
        protected int _id;
        protected string _item;
        protected string _subGrupo;
        protected string _grupo;
        protected bool _controlar;
        protected bool _pintar;
        protected bool _reacondicionar;
        protected bool _reponer;
        protected int _columna;
        protected int _orden;
        protected int _idPresupuesto;
        protected decimal _reponerCantidad;
        protected int _reacondicionarCantidad;
        protected decimal _pintarCantidad;
        protected bool _esExtra;
        protected bool _sacarColocar;
        
        //Objetos asociados
        #endregion

        #region Propiedades
        public int ID
        {
            get
            {
                return _id;
            }
            set
            {
                _id = value;
            }
        }
        public string Item
        {
            get
            {
                return _item;
            }
            set
            {
                _item = value;
            }
        }
        public string SubGrupo
        {
            get
            {
                return _subGrupo;
            }
            set
            {
                _subGrupo = value;
            }
        }
        public string Grupo
        {
            get
            {
                return _grupo;
            }
            set
            {
                _grupo = value;
            }
        }
        public bool Controlar
        {
            get
            {
                return _controlar;
            }
            set
            {
                _controlar = value;
            }
        }
        public bool Pintar
        {
            get
            {
                return _pintar;
            }
            set
            {
                _pintar = value;
            }
        }
        public bool Reacondicionar
        {
            get
            {
                return _reacondicionar;
            }
            set
            {
                _reacondicionar = value;
            }
        }
        public bool Reponer
        {
            get
            {
                return _reponer;
            }
            set
            {
                _reponer = value;
            }
        }
        public int Columna
        {
            get
            {
                return _columna;
            }
            set
            {
                _columna = value;
            }
        }
        public int Orden
        {
            get
            {
                return _orden;
            }
            set
            {
                _orden = value;
            }
        }
        public int IdPresupuesto
        {
            get
            {
                return _idPresupuesto;
            }
            set
            {
                _idPresupuesto = value;
            }
        }
        public decimal ReponerCantidad
        {
            get
            {
                return _reponerCantidad;
            }
            set
            {
                _reponerCantidad = value;
            }
        }
        public int ReacondicionarCantidad
        {
            get
            {
                return _reacondicionarCantidad;
            }
            set
            {
                _reacondicionarCantidad = value;
            }
        }
        public decimal PintarCantidad
        {
            get
            {
                return _pintarCantidad;
            }
            set
            {
                _pintarCantidad = value;
            }
        }
        public bool EsExtra
        {
            get
            {
                return _esExtra;
            }
            set
            {
                _esExtra = value;
            }
        }
        public bool SacarColocar
        {
            get
            {
                return _sacarColocar;
            }
            set
            {
                _sacarColocar = value;
            }
        }
        #endregion

        #region Interfase DAL
        //objeto de la capa DAL
        private static ElementoTableAdapter _elementoAD;
        protected static ElementoTableAdapter Adaptador
        {
            get
            {
                if (_elementoAD == null)
                    _elementoAD = new ElementoTableAdapter();

                return _elementoAD;
            }
        }
        protected static ONElemento ObtenerPorID(int pID)
        {
            ONElemento _elemento = null;
            _STG_DAL.ElementoDataTable _dt;

            // obtengo el elemento por ID
            ElementoTableAdapter _adaptador = new ElementoTableAdapter(); // lo creo aca por que este es un metodo estatico
            _dt = _adaptador.ObtenerPorId(pID);

            // si tiene algo,
            if (_dt.Rows.Count > 0)
                _elemento = AsignarRowAObjeto((_STG_DAL.ElementoRow)_dt.Rows[0]);

            return _elemento;
        }
        protected static ONElemento AsignarRowAObjeto(_STG_DAL.ElementoRow pRow)
        {
            ONElemento _elemento = null;
            if (pRow != null)
            {
                _elemento = new ONElemento();
                _elemento.ID = pRow.ID;
                try { _elemento.Item = pRow.Item; }
                catch { _elemento.Item = ""; }
                try { _elemento.SubGrupo = pRow.SubGrupo; }
                catch { _elemento.SubGrupo = ""; }
                try { _elemento.Grupo = pRow.Grupo; }
                catch { _elemento.Grupo = ""; }
                try { _elemento.Controlar = pRow.Controlar; }
                catch { _elemento.Controlar = false; }
                try { _elemento.Pintar = pRow.Pintar; }
                catch { _elemento.Pintar = false; }
                try { _elemento.Reacondicionar = pRow.Reacondicionar; }
                catch { _elemento.Reacondicionar = false; }
                try { _elemento.Reponer = pRow.Reponer; }
                catch { _elemento.Reponer = false; }
                try { _elemento.Columna = pRow.Columna; }
                catch { _elemento.Columna = 1; }
                try { _elemento.IdPresupuesto = pRow.IdPresupuesto; }
                catch { _elemento.IdPresupuesto = 0; }
                try { _elemento.Orden = pRow.Orden; }
                catch { _elemento.Orden = 0; }
                try { _elemento.ReponerCantidad = pRow.ReponerCantidad; }
                catch { _elemento.ReponerCantidad = decimal.Zero; }
                try { _elemento.ReacondicionarCantidad = pRow.ReacondicionarCantidad; }
                catch { _elemento.ReacondicionarCantidad = 0; }
                try { _elemento.PintarCantidad = pRow.PintarCantidad; }
                catch { _elemento.PintarCantidad = decimal.Zero; }
                try { _elemento.EsExtra = pRow.EsExtra; }
                catch { _elemento.EsExtra = false; }
                try { _elemento.SacarColocar = pRow.SacarColocar; }
                catch { _elemento.SacarColocar = false; }
            }
            return _elemento;
        }
        protected ONElemento InsertarDAL(string pItem, string pSubGrupo, string pGrupo, bool pControlar, bool pPintar, bool pReacondicionar, bool pReponer, int pColumna, int pOrden, int pIdPresupuesto, decimal pReponerCantidad, int pReacondicionarCantidad, decimal pPintarCantidad, bool pEsExtra, bool pSacarColoar)
        {
            ID = int.Parse(Adaptador.Insertar(pItem, pSubGrupo, pGrupo, pReponerCantidad, pControlar, pPintar, pReacondicionar, pReponer, pColumna, pIdPresupuesto, pOrden, pReacondicionarCantidad, pPintarCantidad, pEsExtra, pSacarColoar).ToString());
            return this;
        }
        protected static bool EliminarDAL(int pIDPresupuesto)
        {
            if (Adaptador.Eliminar(pIDPresupuesto) == 0)
                return false;
            else
                return true;
        }
        public static bool EliminarPorIdDAL(int pIDElemento)
        {
            if (Adaptador.EliminarPorId(pIDElemento) == 0)
                return false;
            else
                return true;
        }
        protected bool ActualizarDAL(string pItem, string pSubGrupo, string pGrupo, bool pControlar, bool pPintar, bool pReacondicionar, bool pReponer, int pColumna, int pIdPresupuesto, int pOrden, int pID, decimal pReponerCantidad, int pReacondicionarCantidad, decimal pPintarCantidad, bool pEsExtra, bool pSacarColocar)
        {
            if (0 < Adaptador.Actualizar(pItem, pSubGrupo, pGrupo, pReponerCantidad, pControlar, pPintar, pReacondicionar, pReponer, pColumna, pIdPresupuesto, pOrden, pReacondicionarCantidad, pPintarCantidad, pEsExtra, pSacarColocar, pID))
                return true;
            else
                return false;
        }
        public static ONElementoColeccion ObtenerElementosPorPresupuestoDAL(int pIDPresupuesto)
        {
            _STG_DAL.ElementoDataTable _dt;

            ElementoTableAdapter _adaptador = new ElementoTableAdapter(); // lo creo aca por que este es un metodo estatico
            _dt = _adaptador.ObtenerTodosLosElementosDePresupuesto(pIDPresupuesto);

            return AsignarElementoTableAdapterAElementoColeccion(_dt);

        }
        public static ONElementoColeccion ObtenerElementosDePresupuestoPorColumnaDAL(int pIDPresupuesto, int pColumna)
        {
            _STG_DAL.ElementoDataTable _dt;

            ElementoTableAdapter _adaptador = new ElementoTableAdapter(); // lo creo aca por que este es un metodo estatico
            _dt = _adaptador.ObtenerElementosDePresupuestoPorColumna(pIDPresupuesto, pColumna);

            return AsignarElementoTableAdapterAElementoColeccion(_dt);

        }
        public static ONElementoColeccion ObtenerElementosParaCrearLineaDeTiempo(int pPresupuestoId)
        {   
            return AsignarElementoTableAdapterAElementoColeccion(Adaptador.ObtenerElementosParaCrearLineaDeTiempo(pPresupuestoId));
        }
        public static ONElementoColeccion ObtenerRepuestosDePresupuestoNoAsignados(int pPresupuestoId)
        {
            return AsignarElementoTableAdapterAElementoColeccion(Adaptador.ObtenerRepuestosDePresupuestoNoAsignados(pPresupuestoId));
        }
        

        public static ONElementoColeccion ObtenerTodosParaReponerDePresupuesto(int pPresupuestoId)
        {
            return AsignarElementoTableAdapterAElementoColeccion(Adaptador.ObtenerTodosParaReponerDePresupuesto(pPresupuestoId));
        }
        protected static ONElementoColeccion AsignarElementoTableAdapterAElementoColeccion(_STG_DAL.ElementoDataTable pDataTable)
        {
            ONElementoColeccion _elementos = new ONElementoColeccion();
            ONElemento _elemento;

            if ((pDataTable != null)
                && (pDataTable.Rows.Count > 0))
            {
                foreach (_STG_DAL.ElementoRow _row in pDataTable.Rows)
                {
                    _elemento = AsignarRowAObjeto(_row);
                    if (_elemento != null)
                        _elementos.Add(_elemento);
                }
            }
            return _elementos;
        }

        #endregion

        #region Métodos
        public ONElemento()
        {
            AsignarValoresIniciales();
        }

        public void AsignarValoresIniciales()
        {
            _id = -1;
            Item = "";
            SubGrupo = "";
            Grupo = "";
            Controlar = false;
            Pintar = false;
            Reacondicionar = false;
            Reponer = false;
            Columna = 1;
            IdPresupuesto = 0;
            ReponerCantidad = decimal.Zero;
            ReacondicionarCantidad = 0;
            PintarCantidad = decimal.Zero;
            EsExtra = false;
        }

        public static ONElemento CrearElemento()
        {
            ONElemento _elemento = new ONElemento();
            return _elemento;
        }
        public static ONElemento CrearElemento(int pID)
        {
            ONElemento _elemento = ObtenerPorID(pID);
            return _elemento;
        }
        public ONElemento Insertar()
        {
            return InsertarDAL(Item, SubGrupo, Grupo, Controlar, Pintar, Reacondicionar, Reponer, Columna, Orden, IdPresupuesto, ReponerCantidad, ReacondicionarCantidad, PintarCantidad, EsExtra, SacarColocar);
        }
        public bool Actualizar()
        {
            return ActualizarDAL(Item, SubGrupo, Grupo, Controlar, Pintar, Reacondicionar, Reponer, Columna, IdPresupuesto, Orden, ID, ReponerCantidad, ReacondicionarCantidad, PintarCantidad, EsExtra, SacarColocar);
        }
        /// <summary>
        /// Elimina todos los elemntos asociados al presupuesto.
        /// </summary>
        /// <param name="pIdPresupuesto"></param>
        /// <returns></returns>
        public static bool Eliminar(int pIdPresupuesto)
        {
            return EliminarDAL(pIdPresupuesto);
        }
        #endregion

        #region Metodos para datasource
        public void Actualizar(ONElemento pElemento)
        {
            if (pElemento != null)
                pElemento.Actualizar();
        }
        public ONElemento Insertar(ONElemento pElemento)
        {
            if (pElemento != null)
                return pElemento.Insertar();
            return null;
        }
        /// <summary>
        /// Elimina todos los elementos que esten asociados al mismo presupuesto.
        /// </summary>
        /// <param name="pElemento"></param>
        public void Eliminar(ONElemento pElemento)
        {
            ONElemento.Eliminar(pElemento.IdPresupuesto);
            pElemento = null;
        }
        #endregion
    }
    [System.ComponentModel.DataObject]
    public class ONElementoColeccion : System.Collections.CollectionBase
    {
        public void Add(ONElemento pElemento)
        {
            this.List.Add(pElemento);
        }
        public void AddUnico(ONElemento pElemento)
        {
            foreach (ONElemento _elemento in this)
                if (pElemento.ID == _elemento.ID)
                    return;
            this.List.Add(pElemento);
        }
        public void Remove(int index)
        {
            if (index <= Count - 1 || index >= 0)
            {
                this.List.RemoveAt(index);
            }
            else
            {
                throw new System.ArgumentException("Fuera de rango", "original");
            }
        }
        public void Remove(ONElemento pElemento)
        {
            for (int i = 0; i < this.Count; i++)
            {
                if (this[i].ID == pElemento.ID)
                {
                    Remove(i);
                    return;
                }

            }
        }
        public ONElemento this[int index]
        {
            get { return ((ONElemento)(this.List[index])); }
            set { this.List[index] = value; }
        }
        public ONElementoColeccion ObtenerElementosPorPresupuesto(int pIDPresupuesto)
        {
            return ONElemento.ObtenerElementosPorPresupuestoDAL(pIDPresupuesto);
        }
        public void ActualizarElementos(ONElementoColeccion pElementos)
        {
            foreach (ONElemento _elemento in pElementos)
            {
                _elemento.Actualizar();
            }
        }
        public void ActualizarElemento(ONElemento pElemento)
        {
            pElemento.Actualizar();
        }

        #region Metodos de colección
        /// <summary>
        /// Devuelve el valor de pintura calculado a partir de los elementos que tiene cargados la colección
        /// Se utiliza para recalcular en forma automatica los costos de pintura.
        /// </summary>
        /// <param name="pCostoPano"></param>
        /// <returns></returns>
        public decimal CalcularCostoPintura(decimal pCostoPano)
        {
            /// Funcionamiento: Pintura: el valor en original puede ser calculado como siguie
            ///     Costo de pintura = Costo de paño * Las columnas q esten activas en pintura * el valor ingresado (ya que es paño)
            ///     
            decimal _resultado = decimal.Zero;

            foreach (ONElemento _elemento in this)
            {
                //if (_elemento.Pintar == true)
                    _resultado = _resultado + pCostoPano * _elemento.PintarCantidad;
            }

            return _resultado;
        }
        /// <summary>
        /// Devuelve el valor de los costos de los repuestos a partir de los elementos que tiene cargados la colección
        /// Se utiliza para recalcular en forma automatica los costos de los repuestos.
        /// </summary>
        /// <param name="pCostoPano"></param>
        /// <returns></returns>
        public decimal CalcularCostoDeRepuestos()
        {
            /// Funcionamiento: Pintura: el valor en original puede ser calculado como siguie
            ///     Costo de pintura = Costo de paño * Las columnas q esten activas en pintura * el valor ingresado (ya que es paño)
            ///     
            decimal _resultado = decimal.Zero;

            foreach (ONElemento _elemento in this)
                    _resultado = _resultado + _elemento.ReponerCantidad;

            return _resultado;
        }
        #endregion
        #region Para datasource
        public ONElementoColeccion ObtenerElementosDePresupuestoPorColumnaDAL(int pIdPresupuesto, int pColumna)
        {
            return ONElemento.ObtenerElementosDePresupuestoPorColumnaDAL(pIdPresupuesto, pColumna);
        }
        /// <summary>
        /// Devuelve los elementos de la colección que estén asociados a la columna.
        /// Puede ser 1, 2 o 3.
        /// </summary>
        /// <returns></returns>        
        public ONElementoColeccion ObtenerElementosColumna(int pNumeroColumna)
        {
            if ((pNumeroColumna < 1) || (pNumeroColumna > 3))
                throw new ArgumentException("La columna debe ser 1, 2 o 3. Valor solicitado =" + pNumeroColumna.ToString());

            ONElementoColeccion _resultado = new ONElementoColeccion();

            foreach (ONElemento _elemento in this)
                if (_elemento.Columna == 1)
                    _resultado.Add(_elemento);

            return _resultado;
        }
        public void Eliminar(ONElemento pElemento)
        {
            ONElemento.EliminarPorIdDAL(pElemento.ID);
        }
        #endregion
    }
}
